

const x = {
    id: 5005,
    name: '王某融',
    gender: '女士',
    introduce(){
        console.log(`大家好，我是${this.name}`);
    }
}

Object.defineProperty(x, 'hometown', { value: '甘肃天水' } );

const p = {
    hello(){
        console.log(`大家好`);
    }
}

Object.setPrototypeOf(x, p);

// Object.keys( object )
// 作用: 获取指定对象(object)的自身所有可枚举属性名组成的数组
// 返回: 返回指定对象自身所有可枚举属性名组成的数组
let keys = Object.keys( x );
console.log( keys );

// Object.values( object )
// 作用: 获取指定对象(object)的自身所有可枚举属性值组成的数组
// 返回: 返回指定对象自身所有可枚举属性值组成的数组
let values = Object.values(x);
console.log( values );


// Object.entries( object )
// 作用: 获取指定对象(object)的自身所有可枚举"属性名-属性值"组成的数组
// 返回: 返回指定对象自身所有可枚举"属性名-属性值"组成的数组
let entries = Object.entries(x);
// console.log( entries );
for(let i = 0 ; i < entries.length; i++ ){
    // 注意这里的entry也是个数组
    let entry = entries[i];
    // 在entry数组中，索引0处是属性名，索引1处是属性值
    console.log( entry[0] , entry[1] );
}

// 注意:
// Object.keys 、Object.values 、Object.entries 
// 都不获取自身不可被枚举的属性，
// 也都不获取从原型继承的属性

console.log( '- '.repeat(10) );

// 如果需要获得指定对象自身所有属性(不论是否可枚举)
// 则可以通过 Object.getOwnPropertyNames 方法
let propertyNames = Object.getOwnPropertyNames( x );
for(let i = 0 ; i < propertyNames.length; i++ ){
    let property = propertyNames[ i ];
    let value = x[ property ];
    console.log( property, value );
}